Whisper 模型中文调优

因为网上对于 Whisper 模型的中文优化博客几乎都是从同一篇文章抄的,一个字都不带动,要不就是完全用 AI 生成的赛博垃圾。在这里点名批评:

我花了些时间自己整理了足够可行的方案,在此分享。

为什么要写这篇博客

众所周知,Whisper 模型是 CloseAI OpenAI 开源的一个 STT 模型,性能强劲的同时可以直接在本地运行。但是你如果尝试过直接使用 Whisper 模型(或者速度优化后的 Faster-Whisper 模型)来转录中文语音,你会发现几乎必须要使用参数量最大的 Large-v3 模型才有能看的效果。

我在本地也尝试过 Faster-Whisper 模型,在我的 16G 核显本上,最大只能用 small 模型(占用 1.3G 内存左右),我也尝试过更大一点的 medium 模型,它也不是不能跑,只是速度相比 small 要慢很多,而且 3G 以上的内存占用也让我的电脑 OOM 了好几次。

那么,下面进入正文,这里的调优分为三个部分:

  1. 音频预处理
  2. 模型调用参数优化
  3. 转录文本处理

音频预处理

我在 AI 的帮助下编写了这个音频预处理模块,其主要功能如下:

合并两个声道的音频数据,合为一个声道

音频带有双声道最重要的作用是给人以空间感,而我们使用 Whisper 模型的目的是转录,在转录的使用场景下,空间感所带来的信息反而多余,会干扰模型的处理。

使用 noisereduce 库降噪

这个很好理解,降低噪音,凸显人声

去除空白音频

这一步中,我们使用 pydub 库自带的 split_on_silence 函数以一定的阈值来寻找并去除空白片段(这里说是空白片段,但实际上是响度低于一定阈值的片段)。

要去除空白片段的原因是 Whisper 模型会尝试转录空白片段,从中识别语句。去除后可以排除干扰。


我实测后发现,音频预处理这一步对于小参数模型提升较大。

模型调用参数优化

这一步比较简单,主要就是给模型提供一个 initial_prompt,让模型在转录中文文本时也能适当地加上标点。

可以传入一个带有多个不同标点的中文语句,比如:你好,这是一个包含逗号、句号等标点符号的中文语句。

转录文本处理

在使用 Whisper 模型转录中文音频时,转录结果中容易存在下面几个问题:

  1. 标点缺失(这个可以通过上面的步骤二部分解决)
  2. 不使用中文的全角标点而使用半角标点
  3. 输出繁体字
  4. 同音字误用

下面我们逐一给出解决方案。

标点缺失

除了通过传入 prompt 优化以外,还可以通过类似于 zh-wiki-punctuation-restore 这样专门的恢复标点符号的小模型来补上缺失的标点符号。(这个小模型只有 0.1B 的参数量,完全能够本地运行)

只使用半角标点

这个问题可以使用 autocorrect,这是一个专门纠正中日韩语言与英语混写时常见的标点符号使用错误和空格缺失的库,使用 rust 编写,速度极快,同时提供了多种编程语言的 SDK。

输出繁体字

这个问题可以使用 OpenCC 这个专门的繁简字互转库解决。

同音字误用

这是最棘手的问题。一个比较无脑的改善方案就是使用更大参数的 Whisper 模型,但是这在本地部署的场景下可能不太现实。

虽然存在类似于 T5Corrector 这样专门的同音字误用纠正模型可用,不过更通用一些的方案可能是用中文的大语言模型来处理。经过测试,使用千问三的模型,4B 参数模型在开启思考后基本能够正确纠错,如果是对实时性有一定要求的场景,14B 左右参数量的模型在不开思考的情况下也能够正确纠错,延迟基本在 1.5 秒以内。

点此查看原文